import 'package:flutter_lui/src/l_color_Print.dart';

class LEvents {
  static LEvents instance = LEvents._();
  LEvents._();

  final Map<String, List<Function>> _event = {};

  /// 检测事件是否监听
  /// 可以模糊检测,只要有事件就认为在监听
  /// 也可以精确检测,事件和方法同时对应才认为在监听
  bool hasListener(String eventName, [Function? func]) {
    var has = false;
    if (_event.containsKey(eventName) &&
        (func == null || _event[eventName]!.contains(func))) {
      has = true;
    }
    return has;
  }

  /// 添加监听事件
  void addListener(String eventName, Function func) {
    if (_event[eventName] == null) {
      _event[eventName] = <Function>[];
    }
    List<Function> list = _event[eventName]!;
    bool has = false;
    for (var item in list) {
      if (item == func) {
        has = true;
      }
    }
    if (!has) {
      _event[eventName]!.add(func);
    }
  }

  /// 移除监听事件
  /// 可以模糊移除,只传事件名称会移除所有监听该事件的方法
  /// 可以精确移除,传入事件和方法,只移除此监听方法,不影响监听此事件的别的方法
  void removeListener(String eventName, [Function? func]) {
    if (_event.containsKey(eventName)) {
      List<Function> list = _event[eventName] ?? [];
      if (func == null) {
        _event.remove(eventName);
      } else if (list.contains(func)) {
        list.remove(func);
      }
    }
  }

  /// 发送事件
  /// 数据可选
  void send<T>(String eventName, [T? data]) {
    List<Function> list = _event[eventName] ?? [];
    for (var func in list) {
      try {
        func(data);
      } catch (e) {
        LColorPrint.error(e);
      }
    }
  }
}
